#include "CandidatoABM.h"

using namespace ABM;

CandidatoABM::CandidatoABM() :
	IAbm("Candidato") {
	this->manejadorCargo = new ManejadorCargo();
	this-> manejadorCandidato = new ManejadorCandidato();
	this-> manejadorVotante = new ManejadorVotante();
	this->manejadorEleccion = new ManejadorEleccion();
	this->manejadorLista = new ManejadorLista();

}

bool CandidatoABM::alta() {

	bool resultado = false;
	bool seGuardo = false;
	Candidato* candidato = new Candidato();

	int fecha = 0;
	string cargoPpalDeLaEleccion = "";
	string nombreLista = "";
	int dni = 0;
	string cargoAPostularse = "";

	cout << "ingrese FECHA de la Eleccion: ";
	cin >> fecha;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	cout << endl;
	cout << "ingrese nombre del CARGO PRINCIPAL de la Eleccion: ";
	getline(cin,cargoPpalDeLaEleccion);
	cargoPpalDeLaEleccion = Utils::aMinuscula(cargoPpalDeLaEleccion);

	while (this->manejadorEleccion->existe(fecha, cargoPpalDeLaEleccion)) {

		cout << "Ingrese el nombre de la Lista: ";
		getline(cin,nombreLista);
		nombreLista = Utils::aMinuscula(nombreLista);

		while (this->manejadorLista->existe(fecha, cargoPpalDeLaEleccion, nombreLista)) {
			cout << "Ingrese DNI del candidato: ";
			cin >> dni;
			cin.ignore();
			while (this->manejadorVotante->existe(Utils::convertirEnteroAString(dni))) {
				cout << "Ingrese el Cargo al que se postula el candidato: ";
				getline(cin,cargoAPostularse);
				cargoAPostularse = Utils::aMinuscula(cargoAPostularse);
				while (this->manejadorCargo->existe(cargoAPostularse)) {
					candidato->setLista(fecha, cargoPpalDeLaEleccion, nombreLista);
					candidato->setVotante(dni);
					candidato->setCargo(cargoAPostularse);
					resultado = this->manejadorCandidato->alta(candidato);
					seGuardo = true;
					break;
				}
				if (!seGuardo) {
					cout << "No existe el cargo al que se postula el candidato" << endl;
					getchar();
					break;
				}
				break;
			}
			if (!seGuardo) {
				cout << "el DNI del Candidato no se encuentra registrado en nuestra base de datos. ";
				cout << "Por favor asegurese que los datos ingresados sean correctos" << endl;
				getchar();
				break;
			}
			break;
		}
		if (!seGuardo) {
			cout << "No existe ninguna lista con el nombre " << nombreLista << endl;
			getchar();
			break;
		}
		break;
	}

	delete candidato;

	return resultado;

}

bool CandidatoABM::baja() {

	bool resultado = false;
	Candidato* candidato = new Candidato();
	string nombreLista = "";

	cout << "Ingrese el Nombre de la Lista del candidato: ";
	getline(cin, nombreLista);
	nombreLista = Utils::aMinuscula(nombreLista);
	candidato->getLista()->setNombre(nombreLista);
	resultado = this->manejadorCandidato->baja(candidato);

	delete candidato;
	return resultado;
}

bool CandidatoABM::modificacion() {
	cout << " No existen modificaciones para esta Opcion." << endl;
	getchar();
	return false;
}

void CandidatoABM::altaMasiva(){
	ArchivoAltasMasivas* arch = new ArchivoAltasMasivas("candidatoCargaMasiva.txt");
	string linea;
	Candidato* candidato;
	vector<string>* campos;

	int fecha;
	string cargoPpal;
	string lista;
	string votante;
	string cargo;

	linea = arch->leerLinea();

	while (!arch->finDeArchivo()) {
		candidato = new Candidato();
		campos = Parser::separarCampos(&linea, separadorCampos);

		//si no tiene por lo menos cinco elementos, estaba mal la línea del archivo, lo descarto
		if (campos->size() >= 5) {
			for (unsigned int i = 0; i < campos->size(); ++i) {
				Parser::reemplazarCaracter(&campos->at(i), separadorPalabras,
						blanco);
			}
			fecha = atoi(campos->at(0).c_str());
			cargoPpal = Utils::aMinuscula(campos->at(1));
			lista = Utils::aMinuscula(campos->at(2));
			votante = Utils::aMinuscula(campos->at(3));
			cargo = Utils::aMinuscula(campos->at(4));

			if (existenLosIdentificadoresExternos(fecha, cargoPpal, lista, votante, cargo)) {
				candidato->setCargo(cargo);
				candidato->setLista(fecha, cargoPpal, lista);
				candidato->setVotante(atoi(votante.c_str()));
				this->manejadorCandidato->alta(candidato);
			}
		}
		fecha = 0;
		cargoPpal.clear();
		lista.clear();
		votante.clear();
		cargo.clear();
		delete candidato;
		delete campos;
		linea = arch->leerLinea();
		this->log->escribir("Se genero Alta Masiva de Candidato.");
	}
	delete arch;
}

bool CandidatoABM::existenLosIdentificadoresExternos(int fecha, string cargoPpal, string lista, string votante, string cargo){
	bool resultado1 = this->manejadorEleccion->existe(fecha,cargoPpal);
	bool resultado2 = this-manejadorLista->existe(fecha,cargoPpal,lista);
	bool resultado3 = this->manejadorVotante->existe(votante);
	bool resultado4 = this->manejadorCargo->existe(cargo);
	return (resultado1 && resultado2 && resultado3 && resultado4);
}

CandidatoABM::~CandidatoABM() {
	delete this->manejadorCargo;
	delete this-> manejadorCandidato;
	delete this-> manejadorVotante;
	delete this->manejadorEleccion;
	delete this->manejadorLista;
}
